//身份证号严格校验
function IdentityIDCard(code) {
    //身份证号前两位代表区域
    var city = {
        11: '北京',
        12: '天津',
        13: '河北',
        14: '山西',
        15: '内蒙古',
        21: '辽宁',
        22: '吉林',
        23: '黑龙江 ',
        31: '上海',
        32: '江苏',
        33: '浙江',
        34: '安徽',
        35: '福建',
        36: '江西',
        37: '山东',
        41: '河南',
        42: '湖北 ',
        43: '湖南',
        44: '广东',
        45: '广西',
        46: '海南',
        50: '重庆',
        51: '四川',
        52: '贵州',
        53: '云南',
        54: '西藏 ',
        61: '陕西',
        62: '甘肃',
        63: '青海',
        64: '宁夏',
        65: '新疆',
        71: '台湾',
        81: '香港',
        82: '澳门',
        91: '国外 '
    }; //身份证格式正则表达式

    var idCardReg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
    var errorMess = ''; //错误提示信息

    var isPass = true; //身份证验证是否通过（true通过、false未通过）
    //如果身份证不满足格式正则表达式

    if (!code || !idCardReg.test(code)) {
        errorMess = '您输入的身份证号格式有误！';
        isPass = false;
    } //区域数组中不包含需验证的身份证前两位
    else if (!city[code.substr(0, 2)]) {
        errorMess = '您输入的身份证地址编码有误！';
        isPass = false;
    } else {
        //18位身份证需要验证最后一位校验位
        if (code.length == 18) {
            code = code.split(''); //∑(ai×Wi)(mod 11)
            //加权因子

            var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //校验位

            var parity = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2];
            var sum = 0;
            var ai = 0;
            var wi = 0;

            for (var i = 0; i < 17; i++) {
                ai = code[i];
                wi = factor[i];
                sum += ai * wi;
            }

            var last = parity[sum % 11];

            if (parity[sum % 11] != code[17]) {
                errorMess = '您输入的身份证号不存在！';
                isPass = false;
            }
        }
    }

    var returnParam = {
        errorMess: errorMess,
        isPass: isPass
    };
    return returnParam;
}

module.exports = {
    IdentityIDCard
};
